/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package application;

import application.beans.CompteBean;
import application.beans.CoursBean;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Étienne
 */
class CoursDAO {
    /**
     * Fonction qui va chercher la liste des cours reliés à un utilisateur grâce
     * à son nom d'usager.
     * @param username
     * @return liste des cours de l'usager
     */
    public List<Cours> chercherCoursUsername(String username){
        List<Cours> cours = null;
        return cours;
    }
    
    /**
     * 
     * @param id
     * @return 
     */
    public Cours chercherCoursID(Integer id){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Cours cours = (Cours) (session.load(Cours.class, id)); 
        return cours;
    }
    
    /**
     * Fonction servant à aller chercher les cours contenant le nom et
     * appartenant au domaine, s'il y a lieu.
     * @param nom
     * @param domaine
     * @return 
     */
    public List<Cours> rechercheCours(String nom, String domaine){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String requete = "SELECT * FROM Cours WHERE LOWER(nom) LIKE :nom "
                + "AND Actif = 'O'";
        
        // S'il y a un domaine, on l'ajoute comme critère de recherche
        if(!(domaine.equals(""))){
            requete +=  " AND domaine = :domaine ";
        }
        
        Query query = session.createSQLQuery(requete)
                                            .addEntity(application.Cours.class);
        query.setParameter("nom", "%" + nom + "%");
        // S'il y a un domaine, on ajoute le paramètre
        if(!(domaine.equals(""))){
            query.setParameter("domaine", chercherDomaineEtude(domaine));
        }
        
        List<Cours> resultats = query.list();
        
        return resultats;
    }
    
    /**
     * Fonction servant à aller chercher les cours dans la base de données 
     * correspondant aux critères passés en paramètre.
     * @param criteres
     * @return liste des cours trouvés
     */
    public List<Cours> rechercheCoursAvancee(CoursBean criteres){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String requete = "FROM Cours as cours WHERE LOWER(cours.titre)"
                + " LIKE :nom AND LOWER(cours.codeCours) LIKE :code AND "
                + "cours.professeur.nomComplet LIKE :prof "
                + "AND cours.domaine LIKE :domaine ORDER BY cours.titre";
        
//        // S'il y a un domaine,on l'ajoute comme critère de recherche
//        if(!(criteres.getDomaine().equals(""))){
//            requete +=  "AND domaine = :domaine ";
//        }
        
        Query query = session.createQuery(requete);
        
        /*
         * Si des critères de chaînes de caractères sont à null,
         * on les mets vides
         */
        if(criteres.getTitre() == null){criteres.setTitre("");}
        if(criteres.getCodeCours() == null){criteres.setCodeCours("");}
        if(criteres.getDomaine() == null){criteres.setDomaine("");}
        if(criteres.getProfesseur() == null){
            CompteBean prof = new CompteBean();
            prof.setNomComplet("");
            criteres.setProfesseur(prof);
        }
        
        query.setParameter("nom", "%" + criteres.getTitre() + "%");
        query.setParameter("code", "%" + criteres.getCodeCours() + "%");
        query.setParameter("prof", "%" + criteres.getProfesseur()
                                                        .getNomComplet() + "%");
        query.setParameter("domaine","%" + criteres.getDomaine() + "%");
        
//        // S'il y a un domaine, on ajoute le paramètre
//        if(!(criteres.getDomaine().equals(""))){
//            query.setParameter("domaine", "%" + criteres.getDomaine() + "%");
//        }
        
        List<Cours> resultats = query.list();
        
        return resultats;
    }
    
    /**
     * Procédure servant à écrire un cours dans la base de données à partir des
     * informations passées en paramètre
     * @param infos 
     */
    public void ecrireCours(CoursBean infos){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
  
        Query query = session.createSQLQuery("insert into COURS(id_prof,"
                  + " nom, code, domaine, groupe) values("
                  + ":prof, "
                  + ":nom, "
                  + ":code, "
                  + ":domaine, "
                  + ":groupe)");

        query.setParameter("prof",infos.getProfesseur().getIdCompte());
        query.setParameter("nom",infos.getTitre());
        query.setParameter("code",infos.getCodeCours());
        query.setParameter("domaine",chercherDomaineEtude(infos.getDomaine()));
        query.setParameter("groupe",infos.getGroupe());
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Procédure servant à mettre à jour un cours dans la base de données à 
     * partir des informations passées en paramètre.
     * @param compte 
     */
    public void miseAJourCours(CoursBean infos){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
        
        Query query = session.createSQLQuery("UPDATE COURS SET "
                + "id_prof = :prof,"
                + "nom = :nom, "
                + "code = :code, "
                + "domaine = :domaine, "
                + "groupe = :groupe, "
                + "actif = :actif "
                + "WHERE id_cours = :idCours");

        query.setParameter("idCours",infos.getIdCours());
        query.setParameter("prof",infos.getProfesseur().getIdCompte());
        query.setParameter("nom",infos.getTitre());
        query.setParameter("code",infos.getCodeCours());
        query.setParameter("domaine",chercherDomaineEtude(infos.getDomaine()));
        query.setParameter("groupe",infos.getGroupe());
        query.setParameter("actif",infos.getActif());
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Fonction servant à créer les liens entre un compte et une liste de cours.
     * @param idCompte
     * @param lstCours
     */
    public void connecterCoursCompte(Integer idCompte, List<Integer> lstCours){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
  
        String requete = "insert into COMPTE_COURS("
                + "FK_ID_COMPTE, FK_ID_COURS) values";
        for(int i = 0; i < lstCours.size(); i++){
            requete +=  "(:idCompte, "  + ":idCours" + i + "),";
        }
        // On enlève la dernière virgule
        requete = requete.substring(0, requete.length() - 1);
        
        Query query = session.createSQLQuery(requete);

        query.setParameter("idCompte",idCompte);
        for(int i = 0; i < lstCours.size(); i++){
           query.setParameter("idCours" + i,  lstCours.get(i));
        }
        
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Fonction servant à supprimer les lien entre un compte et ses cours.
     * @param idCompte
     */
    public void supprimerCoursCompte(Integer idCompte){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
        
        String requete = "DELETE FROM COMPTE_COURS"
                                            + " WHERE FK_ID_COMPTE = :idCompte";
        
        Query query = session.createSQLQuery(requete);
        query.setParameter("idCompte", idCompte);
        
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Fonction servant à créer les liens entre un cours et une liste d'élèves.
     * @param idCours
     * @param lstEleves
     */
    public void connecterElevesCours(Integer idCours, List<Integer> lstEleves){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
  
        String requete = "insert into COMPTE_COURS("
                + "FK_ID_COMPTE, FK_ID_COURS) values(";
        for(int i = 0; i < lstEleves.size(); i++){
            requete +=  ":lstEleves" + i + ", :idCours)";
        }
        
        Query query = session.createSQLQuery(requete);

        query.setParameter("idCours",idCours);
        for(int i = 0; i < lstEleves.size(); i++){
           query.setParameter("lstEleves" + i,  lstEleves.get(i));
        }
        
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Fonction servant à supprimer les lien entre un cours et ses élèves.
     * @param idCours
     */
    public void supprimerElevesCours(Integer idCours){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
        
        String requete = "DELETE FROM COMPTE_COURS "
                                               + "WHERE FK_ID_COURS = :idCours";
        
        Query query = session.createSQLQuery(requete);
        query.setParameter("idCours", idCours);
        
        query.executeUpdate();
        session.getTransaction().commit();
    }
    
    /**
     * Fonction qui va chercher l'id d'un domaine d'étude selon son nom, passé
     * en paramètre.
     * @param nom
     * @return l'id du domaine d'étude
     */
    public Integer chercherDomaineEtude(String nom){
        Integer idDomaine = 0;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.createSQLQuery("SELECT ID_DOMAINE FROM"
                + " DOMAINES_ETUDE WHERE NOM = :nom");
        query.setParameter("nom", nom);
        List<Integer> temp = query.list();
        // S'il est introuvable, le domaine sera "aucun"
        if(!temp.isEmpty()){idDomaine = temp.get(0);}
        
        return idDomaine;
    }
    
    /**
     * Fonction servant à aller chercher la liste des discussions reliées à un
     * cours selon l'id du cours passé en paramètre.
     * @param idCours
     * @return 
     */
    public List<Discussion> chercherDiscussionsCours(Integer idCours){
        List<Discussion> retour = null;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.createSQLQuery("SELECT * FROM DISCUSSION WHERE "
                + "ID_COURS= :idCours").addEntity(application.Discussion.class);
        query.setParameter("idCours", idCours);
        retour = query.list();
        return retour;
    }
    
    List obtenirListeCours()
    {   
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        List temp = new ArrayList();
        temp = session.createSQLQuery("SELECT * FROM cours WHERE actif = 'O'").
                                      addEntity(application.Cours.class).list();
        
        return temp;
    }
}
